package com.example.administrator.hualangrecyclerview;

import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.Gravity;

/**
 * http://blog.csdn.net/z240336124/article/details/50845783
 */
public class RevealDrawable_ extends Drawable {

    private Drawable mUnselectedDrawable, mSelectedDrawable;
    private Rect mOutRect;

    public RevealDrawable_(Drawable unselectedDrawable, Drawable selectedDrawable) {
        this.mUnselectedDrawable = unselectedDrawable;
        this.mSelectedDrawable = selectedDrawable;
        mOutRect = new Rect();
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        // 初始化数据--定义两个
        mUnselectedDrawable.setBounds(bounds);
        mSelectedDrawable.setBounds(bounds);
        super.onBoundsChange(bounds);
    }

    @Override
    public int getIntrinsicWidth() {
        // 得到 Drawable 的实际宽度
        return mSelectedDrawable.getIntrinsicWidth();
    }

    @Override
    public int getIntrinsicHeight() {
        // 得到 Drawable 的实际高度
        return mSelectedDrawable.getIntrinsicHeight();
    }

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(ColorFilter cf) {

    }

    @Override
    public int getOpacity() {
        return 0;
    }

    @Override
    protected boolean onLevelChange(int level) {
        // 感知setLevel的调用然后刷新--Draw()
        invalidateSelf();
        return true;
    }

    /**
     * level:0~10000;全彩色：5000;全灰色：0 或者 10000;渐变：0~5000 5000~10000
     */
    @Override
    public void draw(Canvas canvas) {
        int level = getLevel();
        if (level == 0 || level == 10000) {
            // 全灰
            mUnselectedDrawable.draw(canvas);
        } else if (level == 5000) {
            // 全彩
            mSelectedDrawable.draw(canvas);
        } else {
            // 渐变（一部分灰色一部分彩色）
            // 得到当前drawable的矩形边界
            Rect bounds = getBounds();
            {
                // 1.从灰色的图片抠出左边部分矩形
                // level 0~5000
                float ratio = (level / 5000f) - 1f;
                int w = bounds.width();
                w = (int) (w * Math.abs(ratio));
                int h = bounds.height();
                int gravity = ratio < 0 ? Gravity.LEFT : Gravity.RIGHT;
                // 裁剪
                Gravity.apply(gravity,// 从左边开始切还是从右边开始切
                        w,// 目标矩形的宽
                        h,// 高
                        bounds,// 被抠出的原矩形
                        mOutRect // 最终的Rect 画布里面需要的矩形区域
                );

                // 先保存画布原型
                canvas.save();

                // 将画布裁剪一部分出来
                canvas.clipRect(mOutRect);
                mUnselectedDrawable.draw(canvas);
                // 恢复画布
                canvas.restore();
            }

            {
                // 2. 从彩色的图片抠出右边部分矩形
                // level 5000~10000
                float ratio = (level / 5000f) - 1f;
                int w = bounds.width();
                w -= (int) (w * Math.abs(ratio));
                int h = bounds.height();
                int gravity = ratio < 0 ? Gravity.RIGHT : Gravity.LEFT;
                // 裁剪
                Gravity.apply(gravity,// 从左边开始切还是从右边开始切
                        w,// 目标矩形的宽
                        h,// 高
                        bounds,// 被抠出的原矩形
                        mOutRect // 最终的Rect 画布里面需要的矩形区域
                );

                // 先保存画布原型
                canvas.save();

                // 将画布裁剪一部分出来
                canvas.clipRect(mOutRect);
                mSelectedDrawable.draw(canvas);
                // 恢复画布
                canvas.restore();
            }
        }
    }

}